/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pl.butler.cezary.syncTool.scanning;

import java.io.File;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;

/**
 *
 * @author czarek
 */
public class DirectoryCrawler  {

    final List<File> katalogiDoPrzeszukaniaMain = new ArrayList<File>();
    Deque<File> katalogiDoPrzeszukaniaWorker ;

    public boolean addDirectory(File dir){
        return katalogiDoPrzeszukaniaMain.add(dir);
    }

    private static final Logger log = Logger.getLogger(DirectoryCrawler.class.getName());


    public void goThru(){
        katalogiDoPrzeszukaniaWorker = new LinkedList<File>(katalogiDoPrzeszukaniaMain);
        final long startT = System.currentTimeMillis();
        while(!katalogiDoPrzeszukaniaWorker.isEmpty()){
            final File pwd = katalogiDoPrzeszukaniaWorker.pop();
            for(final File plik: pwd.listFiles()){
                fileSensed(plik);
            }
        }
        log.info(String.format("Zadanie wykonano w %d ms",System.currentTimeMillis()-startT));
    }

    private boolean fileSensed(final File plik){
        if(plik.isDirectory()){
            katalogiDoPrzeszukaniaWorker.push(plik);
            return false;
        }

        emit(new FileSensedEvent(plik));
        return true;
    }
    
    private final List<IFileSensedListener> eventListeners = new ArrayList<IFileSensedListener>();
    
    public void addEventListener(IFileSensedListener lisnener){
        eventListeners.add(lisnener);
    }
    
    public void removeEventListener(IFileSensedListener listener){
        eventListeners.remove(listener);
    }

    private void emit(FileSensedEvent event){
        for(IFileSensedListener listener: eventListeners){
            listener.onFileSenced(event);
        }
    }

}




